#include "stdio.h"
// 补充 string.h 头文件，用于字符串操作函数
#include "string.h"

// 定义最大字符串长度
#define MAX_STR_LEN 100
// 定义年龄最大值
#define MAX_AGE 120
// 定义温度范围相关宏
#define TARGET_TEMP_MIN 25
#define TARGET_TEMP_MAX 30
#define ENV_TEMP_MIN -40
#define ENV_TEMP_MAX 60

// 用户信息结构体
typedef struct {
    // 账户
    char account[MAX_STR_LEN];
    // 密码
    char password[MAX_STR_LEN];
    // 设备编码
    char deviceCode[MAX_STR_LEN];
    // 手机号
    char phone[MAX_STR_LEN];
    // 年龄
    int age;
    // 性别
    char gender[MAX_STR_LEN];
    // 职业
    char occupation[MAX_STR_LEN];
    // 标记是否绑定设备
    int isBound;
} User;

// 环境数据结构体
typedef struct {
    // 温度
    float temperature;
    // 风速
    float windSpeed;
    // 是否下雨
    int isRaining;
} EnvData;

// 季节枚举
typedef enum {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER
} Season;

// 系统状态结构体
typedef struct {
    // 当前用户
    User user;
    // 环境数据
    EnvData envData;
    // 当前季节
    Season season;
    // 标记是否登录
    int isLoggedIn;
} SystemState;

// 全局系统状态
SystemState systemState;

// 函数声明（使用标准函数原型格式，参数列表明确，无参数用 void 填充）
void initSystem(void);
void showCover(void);
void showManual(void);
int login(void);
int tempLogin(void);
void resetPassword(void);
int bindDevice(void);
void getEnvDataAuto(void);
void setEnvDataManual(void);
void inputUserInfo(void);
void selectSeason(void);
void smartAdjustVoltage(void);
void manualAdjustVoltage(void);
void submitFeedback(void);
void monitorDeviceStatus(void);
void showMainMenu(void);
void executeMenuChoice(int choice);

// 初始化系统
void initSystem(void) {
    systemState.isLoggedIn = 0;
    systemState.user.isBound = 0;
    systemState.envData.temperature = 0;
    systemState.envData.windSpeed = 0;
    systemState.envData.isRaining = 0;
    systemState.season = SPRING;
    // 初始化用户账户等信息（简单设置默认值，实际可根据需求调整）
    strcpy(systemState.user.account, "default_account");
    strcpy(systemState.user.password, "default_password");
    strcpy(systemState.user.deviceCode, "");
    strcpy(systemState.user.phone, "");
    systemState.user.age = 0;
    strcpy(systemState.user.gender, "");
    strcpy(systemState.user.occupation, "");
}

// 显示封面
void showCover(void) {
    printf("=======================\n");
    printf("智能服装管理系统封面\n");
    printf("动态生成智能服装图案（模拟）\n");
    printf("文字颜色可切换（模拟）\n");
    printf("=======================\n");
}

// 显示说明书
void showManual(void) {
    printf("=======================\n");
    printf("智能服装管理系统说明书\n");
    printf("穿戴注意事项：\n");
    printf("1. 雨天不建议穿戴\n");
    printf("2. 低龄用户需监护\n");
    printf("RISC-V 技术说明：基于奕斯伟32 位 RISC-V 开发板（EBP3901），实现高效数据处理等功能\n");
    printf("=======================\n");
}

// 登录功能
int login(void) {
    char account[MAX_STR_LEN];
    char password[MAX_STR_LEN];
    printf("请输入账户：");
    scanf("%s", account);
    printf("请输入密码：");
    scanf("%s", password);
    // 简单模拟，实际需对接数据库等
    if (strcmp(account, systemState.user.account) == 0 && strcmp(password, systemState.user.password) == 0) {
        printf("登录成功！\n");
        systemState.isLoggedIn = 1;
        return 1;
    } else {
        printf("账户或密码错误！\n");
        return 0;
    }
}

// 临时登录功能
int tempLogin(void) {
    char deviceCode[MAX_STR_LEN];
    printf("请输入设备编码进行临时登录：");
    scanf("%s", deviceCode);
    // 简单模拟，实际需校验设备编码合法性
    if (strcmp(deviceCode, systemState.user.deviceCode) == 0) {
        printf("临时登录成功！\n");
        systemState.isLoggedIn = 1;
        return 1;
    } else {
        printf("设备编码错误，临时登录失败！\n");
        return 0;
    }
}

// 重置密码
void resetPassword(void) {
    // 简单模拟问题找回，实际需更复杂逻辑
    char answer[MAX_STR_LEN];
    printf("请回答密码找回问题（预设问题：你的出生地？）：");
    scanf("%s", answer);
    if (strcmp(answer, "示例答案") == 0) {
        printf("验证通过，请输入新密码：");
        scanf("%s", systemState.user.password);
        printf("密码重置成功！\n");
    } else {
        printf("验证失败，密码重置失败！\n");
    }
}

// 绑定设备
int bindDevice(void) {
    char deviceCode[MAX_STR_LEN];
    char phone[MAX_STR_LEN];
    char account[MAX_STR_LEN];
    printf("请输入设备编码：");
    scanf("%s", deviceCode);
    printf("请输入手机号：");
    scanf("%s", phone);
    printf("请输入账户：");
    scanf("%s", account);
    // 简单模拟绑定，实际需加密存储等
    if (strcmp(account, systemState.user.account) == 0) {
        strcpy(systemState.user.deviceCode, deviceCode);
        strcpy(systemState.user.phone, phone);
        systemState.user.isBound = 1;
        printf("设备绑定成功！\n");
        return 1;
    } else {
        printf("账户不匹配，绑定失败！\n");
        return 0;
    }
}

// 获取环境数据（自动模式，这里模拟对接API等，简单输出模拟数据）
void getEnvDataAuto(void) {
    // 模拟从API获取数据，这里固定赋值
    systemState.envData.temperature = 25.0;
    systemState.envData.windSpeed = 3.0;
    systemState.envData.isRaining = 0;
    printf("自动获取环境数据：温度 %.1f℃，风速 %.1f m/s，是否下雨：%d\n",
           systemState.envData.temperature, systemState.envData.windSpeed, systemState.envData.isRaining);
    if (systemState.envData.isRaining) {
        printf("因天气下雨，不建议穿戴！\n");
    }
}

// 手动设置环境数据
void setEnvDataManual(void) {
    printf("请输入温度（%d~%d℃）：", ENV_TEMP_MIN, ENV_TEMP_MAX);
    scanf("%f", &systemState.envData.temperature);
    printf("请输入风速：");
    scanf("%f", &systemState.envData.windSpeed);
    printf("是否下雨（1-是，0-否）：");
    scanf("%d", &systemState.envData.isRaining);
    printf("手动设置环境数据完成：温度 %.1f℃，风速 %.1f m/s，是否下雨：%d\n",
           systemState.envData.temperature, systemState.envData.windSpeed, systemState.envData.isRaining);
    if (systemState.envData.isRaining) {
        printf("因天气下雨，不建议穿戴！\n");
    }
}

// 输入用户信息
void inputUserInfo(void) {
    printf("请输入年龄（0~%d）：", MAX_AGE);
    scanf("%d", &systemState.user.age);
    printf("请输入性别：");
    scanf("%s", systemState.user.gender);
    printf("请输入职业：");
    scanf("%s", systemState.user.occupation);
    if (systemState.user.age <= 3) {
        printf("需 18 岁以上成年人陪同！\n");
    }
    // 模拟本地加密存储，这里简单输出
    printf("用户信息已采集并本地加密存储（模拟）：年龄 %d，性别 %s，职业 %s\n",
           systemState.user.age, systemState.user.gender, systemState.user.occupation);
}

// 选择季节
void selectSeason(void) {
    int seasonChoice;
    printf("请选择季节：\n");
    printf("1. 春\n");
    printf("2. 夏\n");
    printf("3. 秋\n");
    printf("4. 冬\n");
    scanf("%d", &seasonChoice);
    switch (seasonChoice) {
        case 1:
            systemState.season = SPRING;
            printf("选择季节为春季，RISC-V 芯片优化温控算法参数（模拟）\n");
            break;
        case 2:
            systemState.season = SUMMER;
            printf("选择季节为夏季，RISC-V 芯片优化温控算法参数（模拟）\n");
            break;
        case 3:
            systemState.season = AUTUMN;
            printf("选择季节为秋季，RISC-V 芯片优化温控算法参数（模拟）\n");
            break;
        case 4:
            systemState.season = WINTER;
            printf("选择季节为冬季，RISC-V 芯片优化温控算法参数（模拟）\n");
            break;
        default:
            printf("无效选择，默认春季\n");
            systemState.season = SPRING;
            break;
    }
}

// 智能调节电压计算与控制（模拟）
void smartAdjustVoltage(void) {
    float targetTemp;
    printf("请输入目标温度（%d~%d℃）：", TARGET_TEMP_MIN, TARGET_TEMP_MAX);
    scanf("%f", &targetTemp);
    if (targetTemp < TARGET_TEMP_MIN || targetTemp > TARGET_TEMP_MAX) {
        printf("目标温度超出范围！\n");
        return;
    }
    // 计算电压 U=环境温度/100 + 0.5×(目标温度-25) + 1
    float voltage = systemState.envData.temperature / 100 + 0.5 * (targetTemp - 25) + 1;
    printf("计算得到电压：%.2f\n", voltage);
    // 简单模拟控制逻辑
    if (voltage < 0) {
        printf("电压为负，触发异常警告！\n");
    } else {
        printf("控制 TEC 半导体制冷 / 制热（模拟）\n");
    }
}

// 手动调节电压计算与控制（模拟）
void manualAdjustVoltage(void) {
    float envTemp, targetTemp;
    int mode; // 1-制冷，2-制热
    printf("请输入环境温度（%d~%d℃）：", ENV_TEMP_MIN, ENV_TEMP_MAX);
    scanf("%f", &envTemp);
    printf("请输入目标温度（%d~%d℃）：", TARGET_TEMP_MIN, TARGET_TEMP_MAX);
    scanf("%f", &targetTemp);
    printf("请选择模式（1-制冷，2-制热）：");
    scanf("%d", &mode);
    // 计算电压（这里简单复用智能调节公式，实际可自定义）
    float voltage = envTemp / 100 + 0.5 * (targetTemp - 25) + 1;
    printf("计算得到建议电压：%.2f\n", voltage);
    printf("RISC-V 芯片执行控制指令（模拟），模式：%s\n", mode == 1 ? "制冷" : "制热");
}

// 提交用户反馈
void submitFeedback(void) {
    char feedback[MAX_STR_LEN * 5];
    printf("请输入反馈内容：");
    // 使用 fgets 处理带空格的输入
    fflush(stdin);
    fgets(feedback, MAX_STR_LEN * 5, stdin);
    printf("反馈内容：%s 已提交（模拟通过 RISC-V 安全加密通道传输）\n", feedback);
}

// 监控设备状态（模拟）
void monitorDeviceStatus(void) {
    printf("=======================\n");
    printf("设备状态监控：\n");
    printf("当前温度：%.1f℃\n", systemState.envData.temperature);
    printf("当前电压：模拟值（需结合硬件）\n");
    printf("工作模式：模拟状态\n");
    printf("历史记录查询与导出（模拟）\n");
    printf("=======================\n");
}

// 显示系统主菜单
void showMainMenu(void) {
    printf("=======================\n");
    printf("智能服装管理系统主菜单\n");
    printf("1. 显示封面\n");
    printf("2. 显示说明书\n");
    printf("3. 登录（账户密码）\n");
    printf("4. 临时登录（设备编码）\n");
    printf("5. 重置密码\n");
    printf("6. 绑定设备\n");
    printf("7. 自动获取环境数据\n");
    printf("8. 手动设置环境数据\n");
    printf("9. 输入用户信息\n");
    printf("10. 选择季节\n");
    printf("11. 智能调节电压\n");
    printf("12. 手动调节电压\n");
    printf("13. 提交用户反馈\n");
    printf("14. 监控设备状态\n");
    printf("0. 退出系统\n");
    printf("=======================\n");
    printf("请输入选择：");
}

// 执行菜单选择
void executeMenuChoice(int choice) {
    switch (choice) {
        case 1:
            showCover();
            break;
        case 2:
            showManual();
            break;
        case 3:
            if (!systemState.isLoggedIn) {
                login();
            } else {
                printf("已登录，无需重复操作！\n");
            }
            break;
        case 4:
            if (!systemState.isLoggedIn) {
                tempLogin();
            } else {
                printf("已登录，无需重复操作！\n");
            }
            break;
        case 5:
            resetPassword();
            break;
        case 6:
            if (systemState.isLoggedIn && !systemState.user.isBound) {
                bindDevice();
            } else if (systemState.user.isBound) {
                printf("设备已绑定，无需重复操作！\n");
            } else {
                printf("请先登录！\n");
            }
            break;
        case 7:
            getEnvDataAuto();
            break;
        case 8:
            setEnvDataManual();
            break;
        case 9:
            inputUserInfo();
            break;
        case 10:
            selectSeason();
            break;
        case 11:
            smartAdjustVoltage();
            break;
        case 12:
            manualAdjustVoltage();
            break;
        case 13:
            submitFeedback();
            break;
        case 14:
            monitorDeviceStatus();
            break;
        case 0:
            printf("退出系统！\n");
            break;
        default:
            printf("无效选择，请重新输入！\n");
            break;
    }
}

// 主函数
int main(void) {
    initSystem();
    int choice;
    do {
        showMainMenu();
        scanf("%d", &choice);
        executeMenuChoice(choice);
    } while (choice != 0);
    return 0;
}
